Puji syukur ke hadirat Tuhan Yang Maha Esa, karena atas berkat dan rahmat-Nya, modul ajar "MySQL Database Lengkap dengan Praktikum" dapat diselesaikan dengan baik. Modul ini dirancang sebagai panduan komprehensif untuk mempelajari sistem manajemen basis data MySQL, mulai dari konsep dasar hingga implementasi praktis.
MySQL merupakan salah satu sistem manajemen basis data relasional (RDBMS) yang paling populer di dunia. Dengan sifatnya yang open source, performa tinggi, dan kemudahan penggunaan, MySQL menjadi pilihan utama dalam pengembangan aplikasi web, baik skala kecil maupun enterprise.
Modul ini disusun secara sistematis dengan pendekatan pembelajaran berbasis praktikum. Setiap materi dilengkapi dengan:
Kami berharap modul ini dapat membantu mahasiswa, pengajar, dan praktisi dalam menguasai MySQL database. Kritik dan saran yang membangun sangat kami harapkan untuk penyempurnaan modul ini di masa mendatang.
Jakarta, Januari 2026
Tim Penyusun
Database (basis data) adalah kumpulan data yang terorganisir secara sistematis dan tersimpan dalam komputer. Data dalam database dapat diakses, dikelola, dan diperbarui dengan mudah menggunakan sistem manajemen database (DBMS).
RDBMS adalah program yang memungkinkan pengguna untuk membuat, memperbarui, dan mengelola database relasional. Data disimpan dalam bentuk tabel yang saling berhubungan.
| Fitur | Deskripsi |
|---|---|
| Tabel | Data disimpan dalam baris dan kolom |
| Primary Key | Identifier unik untuk setiap baris |
| Foreign Key | Menghubungkan antar tabel |
| SQL | Bahasa untuk mengelola database |
| Aspek | Kelebihan |
|---|---|
| Open Source | Gratis dan dapat dimodifikasi |
| Performa | Cepat dan stabil untuk berbagai ukuran data |
| Keamanan | Sistem hak akses yang canggih |
| Cross-platform | Berjalan di Windows, Linux, Mac |
| Skalabilitas | Dapat menangani data besar |
| Tipe | Ukuran | Jangkauan | Penggunaan |
|---|---|---|---|
| TINYINT | 1 byte | -128 s/d 127 | Angka kecil, status |
| SMALLINT | 2 byte | -32,768 s/d 32,767 | Angka sedang |
| MEDIUMINT | 3 byte | -8M s/d 8M | Angka menengah |
| INT | 4 byte | -2B s/d 2B | Angka standar |
| BIGINT | 8 byte | Sangat besar | Angka besar |
| FLOAT | 4 byte | Desimal | Angka desimal presisi tunggal |
| DOUBLE | 8 byte | Desimal | Angka desimal presisi ganda |
| DECIMAL | Variabel | Desimal | Angka desimal presisi tepat |
| Tipe | Ukuran | Deskripsi |
|---|---|---|
| CHAR(n) | n byte | String tetap panjang |
| VARCHAR(n) | n+1 byte | String variabel panjang |
| TEXT | 65,535 byte | Teks panjang |
| MEDIUMTEXT | 16MB | Teks lebih panjang |
| LONGTEXT | 4GB | Teks sangat panjang |
| ENUM | 1-2 byte | Pilihan nilai tertentu |
| SET | 1-8 byte | Kombinasi nilai |
| Tipe | Ukuran | Format | Jangkauan |
|---|---|---|---|
| DATE | 3 byte | YYYY-MM-DD | 1000-01-01 s/d 9999-12-31 |
| TIME | 3 byte | HH:MM:SS | -838:59:59 s/d 838:59:59 |
| DATETIME | 8 byte | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 s/d 9999-12-31 23:59:59 |
| TIMESTAMP | 4 byte | YYYY-MM-DD HH:MM:SS | 1970-01-01 s/d 2038-01-19 |
| YEAR | 1 byte | YYYY | 1901 s/d 2155 |
Buka browser dan ketik: http://localhost/phpmyadmin
Kenali bagian-bagian phpMyAdmin:
SHOW VARIABLES LIKE 'version'; SHOW STATUS; SELECT VERSION();
SHOW DATABASES;
mysql -u username -p mysql -u root -p Enter password: ******
<?php // Koneksi MySQLi (Object-oriented) $mysqli = new mysqli("localhost", "root", "", "nama_database"); if ($mysqli->connect_error) { die("Koneksi gagal: " . $mysqli->connect_error); } echo "Koneksi berhasil"; ?>
<?php try { $pdo = new PDO("mysql:host=localhost;dbname=nama_database", "root", ""); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "Koneksi berhasil"; } catch(PDOException $e) { echo "Koneksi gagal: " . $e->getMessage(); } ?>
mysql -u root -p
mysql> SELECT USER(); mysql> STATUS;
Buat file koneksi_mysqli.php:
<!DOCTYPE html>
<html>
<head>
<title>Koneksi MySQLi</title>
<style>
.success { color: green; padding: 10px; border: 1px solid green; }
.error { color: red; padding: 10px; border: 1px solid red; }
</style>
</head>
<body>
<h2>>Demo Koneksi MySQL dengan MySQLi</h2>
<?php
// Konfigurasi database
$host = "localhost";
$username = "root";
$password = "";
$database = "test";
// Membuat koneksi
$conn = new mysqli($host, $username, $password, $database);
// Cek koneksi
if ($conn->connect_error) {
echo "<div class='error'>โ Koneksi gagal: " . $conn->connect_error . "</div>";
} else {
echo "<div class='success'>โ
Koneksi berhasil!</div>";
// Tampilkan informasi server
echo "<h3>Informasi Server:</h3>";
echo "<ul>";
echo "<li>Server version: " . $conn->server_info . "</li>";
echo "<li>Host info: " . $conn->host_info . "</li>";
echo "<li>Protocol version: " . $conn->protocol_version . "</li>";
echo "<li>Character set: " . $conn->character_set_name() . "</li>";
echo "</ul>";
}
// Tutup koneksi
$conn->close();
?>
</body>
</html>
Buat file koneksi_pdo.php:
<?php // Konfigurasi database $host = 'localhost'; $dbname = 'test'; $username = 'root'; $password = ''; try { // Membuat koneksi PDO $dsn = "mysql:host=$host;dbname=$dbname;charset=utf8mb4"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; $pdo = new PDO($dsn, $username, $password, $options); echo "<div style='color: green; padding: 10px; border: 1px solid green;'>"; echo "โ Koneksi PDO berhasil!<br>"; // Tampilkan informasi PDO echo "Driver: " . $pdo->getAttribute(PDO::ATTR_DRIVER_NAME) . "<br>"; echo "Server version: " . $pdo->getAttribute(PDO::ATTR_SERVER_VERSION) . "<br>"; echo "Client version: " . $pdo->getAttribute(PDO::ATTR_CLIENT_VERSION) . "<br>"; echo "</div>"; } catch (PDOException $e) { // Tangani error koneksi echo "<div style='color: red; padding: 10px; border: 1px solid red;'>"; echo "โ Koneksi gagal: " . $e->getMessage() . "<br>"; echo "Error code: " . $e->getCode() . "<br>"; echo "</div>"; } ?>
Buat file Database.php:
<?php /** * Class Database untuk mengelola koneksi MySQL * Menggunakan pattern Singleton */ class Database { private static $instance = null; private $conn; private $host = 'localhost'; private $username = 'root'; private $password = ''; private $database = 'test'; private function __construct() { try { $this->conn = new mysqli( $this->host, $this->username, $this->password, $this->database ); if ($this->conn->connect_error) { throw new Exception("Connection failed: " . $this->conn->connect_error); } // Set charset $this->conn->set_charset("utf8mb4"); } catch (Exception $e) { die("Error: " . $e->getMessage()); } } public static function getInstance() { if (self::$instance == null) { self::$instance = new Database(); } return self::$instance; } public function getConnection() { return $this->conn; } public function query($sql) { return $this->conn->query($sql); } public function escape($string) { return $this->conn->real_escape_string($string); } public function close() { if ($this->conn) { $this->conn->close(); } } } // Penggunaan $db = Database::getInstance(); $conn = $db->getConnection(); echo "Koneksi database siap digunakan"; ?>
try-catch untuk menangani error koneksi| Error | Penyebab | Solusi |
|---|---|---|
| Connection refused | MySQL server tidak berjalan | Start MySQL di XAMPP/WAMP |
| Access denied for user | Username/password salah | Cek credential database |
| Unknown database | Database tidak ditemukan | Buat database terlebih dahulu |
| Port not open | Port MySQL bukan 3306 | Sesuaikan port di konfigurasi |
Soal 1: Buat koneksi MySQL menggunakan MySQLi dengan pengaturan berikut:
Soal 2: Buat fungsi untuk mengecek status koneksi dan menampilkan:
Soal 3: Buat class Database dengan method:
CREATE DATABASE nama_database; CREATE DATABASE IF NOT EXISTS nama_database;
CREATE DATABASE nama_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SHOW DATABASES; SHOW DATABASES LIKE '%user%';
USE nama_database;
DROP DATABASE nama_database; DROP DATABASE IF EXISTS nama_database;
mysql> CREATE DATABASE universitas; Query OK, 1 row affected (0.01 sec) mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | universitas | +--------------------+ 4 rows in set (0.00 sec) mysql> USE universitas; Database changed mysql> SELECT DATABASE(); +-------------+ | DATABASE() | +-------------+ | universitas | +-------------+ 1 row in set (0.00 sec)
Buat file create_database.php:
<?php // Koneksi ke MySQL server (tanpa memilih database) $conn = new mysqli("localhost", "root", ""); // Cek koneksi if ($conn->connect_error) { die("Koneksi gagal: " . $conn->connect_error); } echo "<h2>Membuat Database dengan PHP</h2>"; // Array database yang akan dibuat $databases = [ "universitas" => "Database Universitas", "perpustakaan" => "Database Perpustakaan", "rumah_sakit" => "Database Rumah Sakit" ]; foreach ($databases as $dbName => $description) { // Query untuk membuat database $sql = "CREATE DATABASE IF NOT EXISTS $dbName CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"; if ($conn->query($sql) === TRUE) { echo "โ Database '$dbName' ($description) berhasil dibuat<br>"; } else { echo "โ Error membuat database '$dbName': " . $conn->error . "<br>"; } } // Tampilkan semua database echo "<h3>Daftar Database:</h3>"; $result = $conn->query("SHOW DATABASES"); echo "<ul>"; while ($row = $result->fetch_array()) { echo "<li>" . $row[0] . "</li>"; } echo "</ul>"; $conn->close(); ?>
Buat file form_create_db.php:
<!DOCTYPE html>
<html>
<head>
<title>Form Pembuatan Database</title>
<style>
body { font-family: Arial; margin: 40px; }
.container { max-width: 600px; margin: 0 auto; }
.form-group { margin-bottom: 15px; }
label { display: block; margin-bottom: 5px; font-weight: bold; }
input[type="text"], select {
width: 100%;
padding: 10px;
border: 2px solid #ddd;
border-radius: 5px;
}
input[type="submit"] {
background: #3498db;
color: white;
padding: 12px 25px;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
}
.result {
margin-top: 20px;
padding: 15px;
border-radius: 5px;
}
.success { background: #d4edda; border: 1px solid #c3e6cb; }
.error { background: #f8d7da; border: 1px solid #f5c6cb; }
</style>
</head>
<body>
<div class="container">
<h2>Form Pembuatan Database Baru</h2>
<form method="POST" action="">
<div class="form-group">
<label>Nama Database:</label>
<input type="text" name="db_name" required
pattern="[a-zA-Z_][a-zA-Z0-9_]*"
title="Huruf, angka, underscore, tidak boleh diawali angka">
<small>Gunakan huruf kecil, tanpa spasi</small>
</div>
<div class="form-group">
<label>Character Set:</label>
<select name="charset">
<option value="utf8mb4">utf8mb4 (Unicode, support emoji)</option>
<option value="utf8">utf8</option>
<option value="latin1">latin1</option>
</select>
</div>
<div class="form-group">
<label>Collation:</label>
<select name="collation">
<option value="utf8mb4_unicode_ci">utf8mb4_unicode_ci</option>
<option value="utf8mb4_general_ci">utf8mb4_general_ci</option>
<option value="latin1_swedish_ci">latin1_swedish_ci</option>
</select>
</div>
<input type="submit" name="submit" value="Buat Database">
</form>
<?php
if (isset($_POST['submit'])) {
$db_name = $_POST['db_name'];
$charset = $_POST['charset'];
$collation = $_POST['collation'];
// Koneksi ke MySQL
$conn = new mysqli("localhost", "root", "");
if ($conn->connect_error) {
echo "<div class='result error'>โ Koneksi gagal: " . $conn->connect_error . "</div>";
} else {
// Query create database
$sql = "CREATE DATABASE IF NOT EXISTS `$db_name`
CHARACTER SET $charset
COLLATE $collation";
if ($conn->query($sql) === TRUE) {
echo "<div class='result success'>";
echo "โ
Database '$db_name' berhasil dibuat!<br>";
echo "Character Set: $charset<br>";
echo "Collation: $collation</div>";
} else {
echo "<div class='result error'>โ Error: " . $conn->error . "</div>";
}
$conn->close();
}
}
?>
<h3>Database yang Sudah Ada:</h3>
<?php
$conn = new mysqli("localhost", "root", "");
$result = $conn->query("SHOW DATABASES");
echo "<ul>";
while ($row = $result->fetch_array()) {
echo "<li>" . $row[0] . "</li>";
}
echo "</ul>";
$conn->close();
?>
</div>
</body>
</html>
CREATE TABLE nama_tabel (
nama_kolom1 tipe_data [constraint],
nama_kolom2 tipe_data [constraint],
...
[table_constraints]
);
| Constraint | Deskripsi |
|---|---|
| NOT NULL | Kolom tidak boleh kosong |
| UNIQUE | Nilai kolom harus unik |
| PRIMARY KEY | Identitas unik setiap baris |
| FOREIGN KEY | Menghubungkan ke tabel lain |
| DEFAULT | Nilai default jika tidak diisi |
| AUTO_INCREMENT | Penomoran otomatis |
| CHECK | Validasi nilai |
USE universitas; CREATE TABLE mahasiswa ( id INT AUTO_INCREMENT PRIMARY KEY, nim VARCHAR(20) NOT NULL UNIQUE, nama VARCHAR(100) NOT NULL, tempat_lahir VARCHAR(50), tanggal_lahir DATE, jenis_kelamin ENUM('L', 'P'), alamat TEXT, email VARCHAR(100) UNIQUE, no_telepon VARCHAR(15), angkatan YEAR, status ENUM('aktif', 'cuti', 'lulus', 'keluar') DEFAULT 'aktif', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
CREATE TABLE dosen ( id INT AUTO_INCREMENT PRIMARY KEY, nidn VARCHAR(20) NOT NULL UNIQUE, nama VARCHAR(100) NOT NULL, gelar_depan VARCHAR(20), gelar_belakang VARCHAR(50), pendidikan_terakhir VARCHAR(50), jabatan_fungsional VARCHAR(50), email VARCHAR(100) UNIQUE, no_telepon VARCHAR(15), alamat TEXT, status ENUM('aktif', 'tidak_aktif') DEFAULT 'aktif', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
CREATE TABLE mata_kuliah ( id INT AUTO_INCREMENT PRIMARY KEY, kode_mk VARCHAR(20) NOT NULL UNIQUE, nama_mk VARCHAR(100) NOT NULL, sks TINYINT NOT NULL CHECK (sks IN (1,2,3,4,6)), semester TINYINT, deskripsi TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
CREATE TABLE perkuliahan ( id INT AUTO_INCREMENT PRIMARY KEY, id_mahasiswa INT NOT NULL, id_mata_kuliah INT NOT NULL, id_dosen INT NOT NULL, semester VARCHAR(10), tahun_akademik VARCHAR(9), nilai_uts DECIMAL(5,2), nilai_uas DECIMAL(5,2), nilai_akhir DECIMAL(5,2), nilai_huruf CHAR(2), FOREIGN KEY (id_mahasiswa) REFERENCES mahasiswa(id) ON DELETE CASCADE, FOREIGN KEY (id_mata_kuliah) REFERENCES mata_kuliah(id) ON DELETE CASCADE, FOREIGN KEY (id_dosen) REFERENCES dosen(id) ON DELETE CASCADE, UNIQUE KEY unique_perkuliahan (id_mahasiswa, id_mata_kuliah, semester, tahun_akademik) );
-- Menampilkan struktur tabel DESCRIBE mahasiswa; DESC mahasiswa; -- Menampilkan perintah CREATE TABLE SHOW CREATE TABLE mahasiswa; -- Menampilkan semua tabel SHOW TABLES; -- Menampilkan informasi tabel SHOW TABLE STATUS LIKE 'mahasiswa';
INSERT INTO mahasiswa VALUES (NULL, '2026001', 'Budi Santoso', 'Jakarta', '2000-01-15', 'L', 'Jl. Merdeka No.1', 'budi@email.com', '08123456789', 2026, 'aktif');
INSERT INTO mahasiswa (nim, nama, email, angkatan) VALUES ('2026002', 'Ani Wijaya', 'ani@email.com', 2026);
INSERT INTO mahasiswa (nim, nama, email, angkatan) VALUES ('2026003', 'Citra Dewi', 'citra@email.com', 2026), ('2026004', 'Dodi Kurniawan', 'dodi@email.com', 2026), ('2026005', 'Eka Putri', 'eka@email.com', 2026);
-- Insert data mahasiswa INSERT INTO mahasiswa (nim, nama, tempat_lahir, tanggal_lahir, jenis_kelamin, alamat, email, no_telepon, angkatan) VALUES ('202601001', 'Ahmad Fauzi', 'Jakarta', '2002-05-10', 'L', 'Jl. Merdeka No. 10', 'ahmad.fauzi@email.com', '081234567001', 2026), ('202601002', 'Budi Santoso', 'Bandung', '2002-08-15', 'L', 'Jl. Asia Afrika No. 25', 'budi.santoso@email.com', '081234567002', 2026), ('202601003', 'Citra Dewi', 'Surabaya', '2002-03-20', 'P', 'Jl. Tunjungan No. 15', 'citra.dewi@email.com', '081234567003', 2026), ('202601004', 'Dian Purnama', 'Medan', '2002-11-05', 'P', 'Jl. Sudirman No. 8', 'dian.purnama@email.com', '081234567004', 2026), ('202601005', 'Eko Prasetyo', 'Semarang', '2002-07-12', 'L', 'Jl. Pandanaran No. 30', 'eko.prasetyo@email.com', '081234567005', 2026);
INSERT INTO dosen (nidn, nama, gelar_depan, gelar_belakang, pendidikan_terakhir, jabatan_fungsional, email, no_telepon, alamat) VALUES ('12345678901', 'Prof. Dr. Hendra Wijaya', 'Prof.', 'Ph.D.', 'S3', 'Guru Besar', 'hendra@univ.ac.id', '081234567101', 'Jl. Pendidikan No. 1'), ('12345678902', 'Dr. Siti Aminah', 'Dr.', 'M.Kom.', 'S3', 'Lektor Kepala', 'siti@univ.ac.id', '081234567102', 'Jl. Ilmu No. 5'), ('12345678903', 'Bambang Susilo', '', 'M.T.', 'S2', 'Lektor', 'bambang@univ.ac.id', '081234567103', 'Jl. Raya No. 12');
INSERT INTO mata_kuliah (kode_mk, nama_mk, sks, semester, deskripsi) VALUES ('IF101', 'Algoritma Pemrograman', 3, 1, 'Dasar-dasar algoritma dan pemrograman menggunakan Python'), ('IF102', 'Struktur Data', 3, 2, 'Konsep dan implementasi struktur data'), ('IF103', 'Basis Data', 3, 3, 'Sistem manajemen basis data dan SQL'), ('IF201', 'Pemrograman Web', 4, 4, 'Pengembangan aplikasi web dengan PHP dan MySQL'), ('IF202', 'Jaringan Komputer', 3, 4, 'Konsep dan implementasi jaringan komputer');
INSERT INTO perkuliahan (id_mahasiswa, id_mata_kuliah, id_dosen, semester, tahun_akademik, nilai_uts, nilai_uas, nilai_akhir, nilai_huruf) VALUES (1, 1, 1, 'Ganjil', '2026/2025', 85, 90, 87.5, 'A'), (1, 2, 2, 'Ganjil', '2026/2025', 78, 82, 80, 'B+'), (2, 1, 1, 'Ganjil', '2026/2025', 90, 88, 89, 'A'), (2, 3, 3, 'Ganjil', '2026/2025', 75, 80, 77.5, 'B'), (3, 2, 2, 'Ganjil', '2026/2025', 82, 85, 83.5, 'B+');
SELECT LAST_INSERT_ID();
<?php $sql = "INSERT INTO mahasiswa (nim, nama) VALUES ('2026006', 'Fajar')"; if ($conn->query($sql) === TRUE) { $last_id = $conn->insert_id; echo "Data berhasil ditambahkan. ID terakhir: " . $last_id; } ?>
<?php $sql = "INSERT INTO mahasiswa (nim, nama) VALUES ('2026007', 'Gita')"; $pdo->exec($sql); $last_id = $pdo->lastInsertId(); echo "ID terakhir: " . $last_id; ?>
<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { $conn = new mysqli("localhost", "root", "", "universitas"); // Insert data mahasiswa $nim = $conn->real_escape_string($_POST['nim']); $nama = $conn->real_escape_string($_POST['nama']); $email = $conn->real_escape_string($_POST['email']); $sql_mahasiswa = "INSERT INTO mahasiswa (nim, nama, email, angkatan) VALUES ('$nim', '$nama', '$email', 2026)"; if ($conn->query($sql_mahasiswa) === TRUE) { $id_mahasiswa = $conn->insert_id; // Insert data perkuliahan menggunakan ID yang baru $id_mk = $_POST['id_mata_kuliah']; $id_dosen = $_POST['id_dosen']; $sql_perkuliahan = "INSERT INTO perkuliahan (id_mahasiswa, id_mata_kuliah, id_dosen, semester, tahun_akademik) VALUES ($id_mahasiswa, $id_mk, $id_dosen, 'Ganjil', '2026/2025')"; if ($conn->query($sql_perkuliahan) === TRUE) { echo "<div style='color: green;'>"; echo "โ Pendaftaran berhasil!<br>"; echo "ID Mahasiswa: $id_mahasiswa<br>"; echo "ID Perkuliahan: " . $conn->insert_id; echo "</div>"; } } $conn->close(); } ?>
INSERT INTO mahasiswa (nim, nama, angkatan) VALUES ('2026008', 'Hadi', 2026), ('2026009', 'Indah', 2026), ('2026010', 'Joko', 2026);
INSERT INTO mahasiswa_baru (nim, nama, angkatan) SELECT nim, nama, angkatan FROM mahasiswa WHERE angkatan = 2026;
<?php $conn = new mysqli("localhost", "root", "", "universitas"); // Data mahasiswa dalam array $data_mahasiswa = [ ['2026011', 'Kartika', 'kartika@email.com'], ['2026012', 'Lukman', 'lukman@email.com'], ['2026013', 'Maya', 'maya@email.com'], ['2026014', 'Nanda', 'nanda@email.com'], ['2026015', 'Oscar', 'oscar@email.com'] ]; // Siapkan query $sql = "INSERT INTO mahasiswa (nim, nama, email, angkatan) VALUES (?, ?, ?, 2026)"; $stmt = $conn->prepare($sql); $stmt->bind_param("sss", $nim, $nama, $email); // Execute multiple times $success = 0; $failed = 0; foreach ($data_mahasiswa as $mhs) { $nim = $mhs[0]; $nama = $mhs[1]; $email = $mhs[2]; if ($stmt->execute()) { $success++; } else { $failed++; } } echo "<h3>Hasil Import Data:</h3>"; echo "โ Berhasil: $success data<br>"; echo "โ Gagal: $failed data<br>"; $stmt->close(); $conn->close(); ?>
Prepared statement adalah fitur keamanan untuk mencegah SQL Injection dengan memisahkan query dan data.
<?php $conn = new mysqli("localhost", "root", "", "universitas"); // Siapkan prepared statement $stmt = $conn->prepare("INSERT INTO mahasiswa (nim, nama, email, angkatan) VALUES (?, ?, ?, ?)"); // Bind parameter (i=int, s=string, d=double, b=blob) $stmt->bind_param("sssi", $nim, $nama, $email, $angkatan); // Set parameter dan execute $nim = "2026016"; $nama = "Putu"; $email = "putu@email.com"; $angkatan = 2026; $stmt->execute(); echo "Data berhasil ditambahkan"; $stmt->close(); $conn->close(); ?>
<?php $conn = new mysqli("localhost", "root", "", "universitas"); // Query dengan parameter $angkatan = 2026; $stmt = $conn->prepare("SELECT * FROM mahasiswa WHERE angkatan = ?"); $stmt->bind_param("i", $angkatan); $stmt->execute(); // Ambil hasil $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { echo $row['nama'] . "<br>"; } $stmt->close(); $conn->close(); ?>
<!DOCTYPE html>
<html>
<head>
<title>Form Aman dengan Prepared Statement</title>
</head>
<body>
<h2>Pendaftaran Mahasiswa Baru</h2>
<form method="POST" action="">
NIM: <input type="text" name="nim" required><br>
Nama: <input type="text" name="nama" required><br>
Email: <input type="email" name="email" required><br>
Angkatan: <input type="number" name="angkatan" value="2026"><br>
<input type="submit" value="Daftar">
</form>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$conn = new mysqli("localhost", "root", "", "universitas");
// Menggunakan prepared statement untuk keamanan
$stmt = $conn->prepare("INSERT INTO mahasiswa (nim, nama, email, angkatan) VALUES (?, ?, ?, ?)");
$stmt->bind_param("sssi", $_POST['nim'], $_POST['nama'], $_POST['email'], $_POST['angkatan']);
if ($stmt->execute()) {
echo "<p style='color: green'>โ
Pendaftaran berhasil!</p>";
} else {
echo "<p style='color: red'>โ Error: " . $stmt->error . "</p>";
}
$stmt->close();
$conn->close();
}
?>
</body>
</html>
Prepared statement secara otomatis meng-escape karakter berbahaya, mencegah SQL Injection seperti:
-- Input berbahaya: '; DROP TABLE mahasiswa; -- $nama = "'; DROP TABLE mahasiswa; --"; -- Tanpa prepared statement (BERBAHAYA!) $sql = "INSERT INTO mahasiswa (nama) VALUES ('$nama')"; -- Akan menjadi: INSERT INTO mahasiswa (nama) VALUES (''; DROP TABLE mahasiswa; --') -- Dengan prepared statement (AMAN) $stmt = $conn->prepare("INSERT INTO mahasiswa (nama) VALUES (?)"); $stmt->bind_param("s", $nama); -- Input akan di-escape: VALUES ('\'; DROP TABLE mahasiswa; --')
SELECT kolom1, kolom2, ... FROM nama_tabel [WHERE kondisi] [ORDER BY kolom [ASC|DESC]] [LIMIT jumlah];
-- Pilih semua kolom SELECT * FROM mahasiswa; -- Pilih kolom tertentu SELECT nim, nama, email FROM mahasiswa; -- SELECT dengan alias SELECT nim AS "NIM", nama AS "Nama Lengkap", email AS "Alamat Email" FROM mahasiswa; -- SELECT dengan fungsi SELECT UPPER(nama) AS nama_kapital, LOWER(email) AS email_kecil, CONCAT(nim, ' - ', nama) AS info FROM mahasiswa;
<!DOCTYPE html>
<html>
<head>
<title>Data Mahasiswa</title>
<style>
table { border-collapse: collapse; width: 100%; }
th { background: #3498db; color: white; padding: 12px; }
td { padding: 10px; border: 1px solid #ddd; }
tr:nth-child(even) { background: #f2f2f2; }
.container { max-width: 1200px; margin: 0 auto; padding: 20px; }
h2 { color: #2c3e50; }
</style>
</head>
<body>
<div class="container">
<h2>๐ Daftar Mahasiswa Aktif</h2>
<?php
$conn = new mysqli("localhost", "root", "", "universitas");
// Query dengan JOIN untuk mendapatkan data lengkap
$sql = "SELECT
m.nim,
m.nama,
m.email,
m.angkatan,
COUNT(p.id_mata_kuliah) AS total_mk,
AVG(p.nilai_akhir) AS ipk
FROM mahasiswa m
LEFT JOIN perkuliahan p ON m.id = p.id_mahasiswa
WHERE m.status = 'aktif'
GROUP BY m.id
ORDER BY m.nama";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "<table>";
echo "<tr><th>NIM</th><th>Nama</th><th>Email</th><th>Angkatan</th><th>Total MK</th><th>IPK</th></tr>";
while ($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td>" . $row['nim'] . "</td>";
echo "<td>" . $row['nama'] . "</td>";
echo "<td>" . $row['email'] . "</td>";
echo "<td>" . $row['angkatan'] . "</td>";
echo "<td>" . ($row['total_mk'] ?? 0) . "</td>";
echo "<td>" . number_format($row['ipk'] ?? 0, 2) . "</td>";
echo "</tr>";
}
echo "</table>";
echo "<p>Total data: " . $result->num_rows . " mahasiswa</p>";
} else {
echo "<p>Tidak ada data mahasiswa</p>";
}
$conn->close();
?>
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>Data Mahasiswa dengan Pencarian</title>
<style>
.search-box { margin: 20px 0; padding: 15px; background: #f4f4f4; border-radius: 5px; }
input[type="text"] { padding: 10px; width: 300px; border: 2px solid #ddd; border-radius: 5px; }
input[type="submit"] { padding: 10px 20px; background: #3498db; color: white; border: none; border-radius: 5px; cursor: pointer; }
</style>
</head>
<body>
<div class="container">
<h2>๐ Pencarian Data Mahasiswa</h2>
<div class="search-box">
<form method="GET" action="">
<input type="text" name="search" placeholder="Cari nama atau NIM..."
value="<?php echo isset($_GET['search']) ? htmlspecialchars($_GET['search']) : ''; ?>">
<input type="submit" value="Cari">
</form>
</div>
<?php
$conn = new mysqli("localhost", "root", "", "universitas");
$search = isset($_GET['search']) ? $_GET['search'] : '';
// Gunakan prepared statement untuk keamanan
if (!empty($search)) {
$searchTerm = "%$search%";
$stmt = $conn->prepare("SELECT * FROM mahasiswa WHERE nama LIKE ? OR nim LIKE ? ORDER BY nama");
$stmt->bind_param("ss", $searchTerm, $searchTerm);
$stmt->execute();
$result = $stmt->get_result();
} else {
$result = $conn->query("SELECT * FROM mahasiswa ORDER BY nama");
}
if ($result->num_rows > 0) {
echo "<table>";
echo "<tr><th>NIM</th><th>Nama</th><th>Email</th><th>Angkatan</th><th>Status</th></tr>";
while ($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td>" . $row['nim'] . "</td>";
echo "<td>" . $row['nama'] . "</td>";
echo "<td>" . $row['email'] . "</td>";
echo "<td>" . $row['angkatan'] . "</td>";
echo "<td>" . $row['status'] . "</td>";
echo "</tr>";
}
echo "</table>";
echo "<p>Ditemukan " . $result->num_rows . " data</p>";
} else {
echo "<p>Tidak ada data ditemukan</p>";
}
if (isset($stmt)) $stmt->close();
$conn->close();
?>
</div>
</body>
</html>
WHERE digunakan untuk memfilter data berdasarkan kondisi tertentu.
| Operator | Deskripsi | Contoh |
|---|---|---|
| = | Sama dengan | angkatan = 2026 |
| != atau <> | Tidak sama | status != 'lulus' |
| > | Lebih besar | sks > 3 |
| < | Lebih kecil | nilai < 70 |
| >= | Lebih besar sama | ipk >= 3.5 |
| <= | Lebih kecil sama | tanggal_lahir <= '2000-01-01' |
| BETWEEN | Antara dua nilai | nilai BETWEEN 70 AND 80 |
| LIKE | Pencarian pola | nama LIKE 'Budi%' |
| IN | Dalam daftar | angkatan IN (2023,2026) |
| IS NULL | Nilai NULL | email IS NULL |
| IS NOT NULL | Bukan NULL | email IS NOT NULL |
-- 1. Mahasiswa angkatan 2026 SELECT * FROM mahasiswa WHERE angkatan = 2026; -- 2. Mahasiswa lahir setelah tahun 2000 SELECT * FROM mahasiswa WHERE tanggal_lahir > '2000-01-01'; -- 3. Mahasiswa dengan nilai antara 80 dan 90 SELECT m.nama, mk.nama_mk, p.nilai_akhir FROM perkuliahan p JOIN mahasiswa m ON p.id_mahasiswa = m.id JOIN mata_kuliah mk ON p.id_mata_kuliah = mk.id WHERE p.nilai_akhir BETWEEN 80 AND 90; -- 4. Pencarian dengan LIKE SELECT * FROM mahasiswa WHERE nama LIKE 'Budi%'; -- Dimulai dengan Budi WHERE nama LIKE '%santoso'; -- Diakhiri dengan santoso WHERE nama LIKE '%dewi%'; -- Mengandung dewi WHERE nama LIKE 'B_d_'; -- Pola dengan wildcard -- 5. Menggunakan IN SELECT * FROM mahasiswa WHERE angkatan IN (2023, 2026, 2025); -- 6. Kombinasi AND dan OR SELECT * FROM mahasiswa WHERE (angkatan = 2026 OR angkatan = 2023) AND status = 'aktif'; -- 7. Mengecek NULL SELECT * FROM mahasiswa WHERE email IS NULL; SELECT * FROM mahasiswa WHERE email IS NOT NULL;
<!DOCTYPE html>
<html>
<head>
<title>Filter Data Mahasiswa</title>
</head>
<body>
<h2>๐ Filter Data Mahasiswa</h2>
<form method="GET" action="">
<select name="angkatan">
<option value="">Semua Angkatan</option>
<option value="2026">2026</option>
<option value="2023">2023</option>
<option value="2022">2022</option>
</select>
<select name="status">
<option value="">Semua Status</option>
<option value="aktif">Aktif</option>
<option value="lulus">Lulus</option>
<option value="cuti">Cuti</option>
</select>
<input type="submit" value="Filter">
</form>
<?php
$conn = new mysqli("localhost", "root", "", "universitas");
// Membangun query dinamis
$sql = "SELECT * FROM mahasiswa WHERE 1=1";
$params = [];
$types = "";
if (!empty($_GET['angkatan'])) {
$sql .= " AND angkatan = ?";
$params[] = $_GET['angkatan'];
$types .= "i";
}
if (!empty($_GET['status'])) {
$sql .= " AND status = ?";
$params[] = $_GET['status'];
$types .= "s";
}
$sql .= " ORDER BY nama";
// Prepared statement
$stmt = $conn->prepare($sql);
if (!empty($params)) {
$stmt->bind_param($types, ...$params);
}
$stmt->execute();
$result = $stmt->get_result();
// Tampilkan hasil
echo "<table border='1'>";
echo "<tr><th>NIM</th><th>Nama</th><th>Angkatan</th><th>Status</th></tr>";
while ($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td>" . $row['nim'] . "</td>";
echo "<td>" . $row['nama'] . "</td>";
echo "<td>" . $row['angkatan'] . "</td>";
echo "<td>" . $row['status'] . "</td>";
echo "</tr>";
}
echo "</table>";
$stmt->close();
$conn->close();
?>
</body>
</html>
ORDER BY digunakan untuk mengurutkan hasil query.
SELECT kolom1, kolom2 FROM tabel ORDER BY kolom1 [ASC|DESC], kolom2 [ASC|DESC];
-- Urutkan berdasarkan nama (A-Z) SELECT * FROM mahasiswa ORDER BY nama ASC; -- Urutkan berdasarkan angkatan terbaru SELECT * FROM mahasiswa ORDER BY angkatan DESC; -- Multiple sorting SELECT * FROM mahasiswa ORDER BY angkatan DESC, nama ASC; -- Sorting dengan ekspresi SELECT nama, YEAR(tanggal_lahir) AS tahun_lahir FROM mahasiswa ORDER BY tahun_lahir DESC;
<!DOCTYPE html>
<html>
<head>
<title>Data Mahasiswa dengan Sorting</title>
<style>
th a { color: white; text-decoration: none; }
th a:hover { text-decoration: underline; }
.sorted { background: #2980b9; }
</style>
</head>
<body>
<h2>๐ Data Mahasiswa</h2>
<?php
$conn = new mysqli("localhost", "root", "", "universitas");
// Ambil parameter sorting
$order_by = isset($_GET['sort']) ? $_GET['sort'] : 'nama';
$order_dir = isset($_GET['dir']) ? $_GET['dir'] : 'ASC';
// Toggle direction untuk next click
$next_dir = ($order_dir == 'ASC') ? 'DESC' : 'ASC';
// Query dengan sorting
$sql = "SELECT * FROM mahasiswa ORDER BY $order_by $order_dir";
$result = $conn->query($sql);
?>
<table border="1">
<tr>
<th><a href="?sort=nim&dir=<?php echo $next_dir; ?>">NIM</a></th>
<th><a href="?sort=nama&dir=<?php echo $next_dir; ?>">Nama</a></th>
<th><a href="?sort=angkatan&dir=<?php echo $next_dir; ?>">Angkatan</a></th>
<th><a href="?sort=ipk&dir=<?php echo $next_dir; ?>">IPK</a></th>
</tr>
<?php
while ($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td>" . $row['nim'] . "</td>";
echo "<td>" . $row['nama'] . "</td>";
echo "<td>" . $row['angkatan'] . "</td>";
echo "<td>" . number_format($row['ipk'] ?? 0, 2) . "</td>";
echo "</tr>";
}
?>
</table>
<p>Diurutkan berdasarkan: <?php echo "$order_by $order_dir"; ?></p>
</body>
</html>
DELETE digunakan untuk menghapus data dari tabel.
DELETE FROM nama_tabel [WHERE kondisi];
<!DOCTYPE html>
<html>
<head>
<title>Hapus Data Mahasiswa</title>
<script>
function confirmDelete(id, nama) {
if (confirm("Apakah Anda yakin ingin menghapus mahasiswa " + nama + "?")) {
window.location.href = "?hapus=" + id;
}
}
</script>
</head>
<body>
<h2>๐๏ธ Hapus Data Mahasiswa</h2>
<?php
$conn = new mysqli("localhost", "root", "", "universitas");
// Proses hapus data
if (isset($_GET['hapus'])) {
$id = (int)$_GET['hapus'];
// Mulai transaction
$conn->begin_transaction();
try {
// Hapus data terkait di perkuliahan
$conn->query("DELETE FROM perkuliahan WHERE id_mahasiswa = $id");
// Hapus data mahasiswa
$conn->query("DELETE FROM mahasiswa WHERE id = $id");
// Commit transaction
$conn->commit();
echo "<p style='color: green'>โ
Data berhasil dihapus!</p>";
} catch (Exception $e) {
// Rollback jika error
$conn->rollback();
echo "<p style='color: red'>โ Gagal menghapus: " . $e->getMessage() . "</p>";
}
}
// Tampilkan data mahasiswa
$result = $conn->query("SELECT * FROM mahasiswa ORDER BY nama");
?>
<table border="1">
<tr>
<th>NIM</th>
<th>Nama</th>
<th>Angkatan</th>
<th>Status</th>
<th>Aksi</th>
</tr>
<?php
while ($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td>" . $row['nim'] . "</td>";
echo "<td>" . $row['nama'] . "</td>";
echo "<td>" . $row['angkatan'] . "</td>";
echo "<td>" . $row['status'] . "</td>";
echo "<td>";
echo "<button onclick='confirmDelete(" . $row['id'] . ", \"" . $row['nama'] . "\")'>Hapus</button>";
echo "</td>";
echo "</tr>";
}
?>
</table>
</body>
</html>
UPDATE digunakan untuk mengubah data yang sudah ada.
UPDATE nama_tabel SET kolom1 = nilai1, kolom2 = nilai2, ... [WHERE kondisi];
<!DOCTYPE html>
<html>
<head>
<title>Edit Data Mahasiswa</title>
</head>
<body>
<h2>โ๏ธ Edit Data Mahasiswa</h2>
<?php
$conn = new mysqli("localhost", "root", "", "universitas");
// Proses update data
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['update'])) {
$id = (int)$_POST['id'];
$nama = $conn->real_escape_string($_POST['nama']);
$email = $conn->real_escape_string($_POST['email']);
$status = $conn->real_escape_string($_POST['status']);
$sql = "UPDATE mahasiswa SET
nama = '$nama',
email = '$email',
status = '$status',
updated_at = CURRENT_TIMESTAMP
WHERE id = $id";
if ($conn->query($sql) === TRUE) {
echo "<p style='color: green'>โ
Data berhasil diupdate!</p>";
} else {
echo "<p style='color: red'>โ Error: " . $conn->error . "</p>";
}
}
// Ambil data untuk diedit
if (isset($_GET['id'])) {
$id = (int)$_GET['id'];
$result = $conn->query("SELECT * FROM mahasiswa WHERE id = $id");
$data = $result->fetch_assoc();
}
?>
<form method="POST" action="">
<input type="hidden" name="id" value="<?php echo $data['id']; ?>">
<label>NIM:</label>
<input type="text" value="<?php echo $data['nim']; ?>" disabled><br>
<label>Nama:</label>
<input type="text" name="nama" value="<?php echo htmlspecialchars($data['nama']); ?>" required><br>
<label>Email:</label>
<input type="email" name="email" value="<?php echo htmlspecialchars($data['email']); ?>" required><br>
<label>Status:</label>
<select name="status">
<option value="aktif" <?php echo $data['status'] == 'aktif' ? 'selected' : ''; ?>>Aktif</option>
<option value="cuti" <?php echo $data['status'] == 'cuti' ? 'selected' : ''; ?>>Cuti</option>
<option value="lulus" <?php echo $data['status'] == 'lulus' ? 'selected' : ''; ?>>Lulus</option>
<option value="keluar" <?php echo $data['status'] == 'keluar' ? 'selected' : ''; ?>>Keluar</option>
</select><br>
<input type="submit" name="update" value="Update Data">
<a href="daftar_mahasiswa.php">Batal</a>
</form>
</body>
</html>
LIMIT digunakan untuk membatasi jumlah baris yang ditampilkan.
SELECT kolom FROM tabel LIMIT jumlah; SELECT kolom FROM tabel LIMIT offset, jumlah;
<!DOCTYPE html>
<html>
<head>
<title>Data Mahasiswa dengan Pagination</title>
</head>
<body>
<h2>๐ Data Mahasiswa (Pagination)</h2>
<?php
$conn = new mysqli("localhost", "root", "", "universitas");
// Konfigurasi pagination
$limit = 5; // Jumlah data per halaman
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$offset = ($page - 1) * $limit;
// Hitung total data
$total_result = $conn->query("SELECT COUNT(*) as total FROM mahasiswa");
$total_row = $total_result->fetch_assoc();
$total_data = $total_row['total'];
$total_pages = ceil($total_data / $limit);
// Ambil data dengan LIMIT
$sql = "SELECT * FROM mahasiswa ORDER BY nama LIMIT $offset, $limit";
$result = $conn->query($sql);
?>
<table border="1">
<tr>
<th>No</th>
<th>NIM</th>
<th>Nama</th>
<th>Angkatan</th>
<th>Status</th>
</tr>
<?php
$no = $offset + 1;
while ($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td>$no</td>";
echo "<td>" . $row['nim'] . "</td>";
echo "<td>" . $row['nama'] . "</td>";
echo "<td>" . $row['angkatan'] . "</td>";
echo "<td>" . $row['status'] . "</td>";
echo "</tr>";
$no++;
}
?>
</table>
<div class="pagination">
<?php if ($page > 1): ?>
<a href="?page=<?php echo $page-1; ?>">ยซ Previous</a>
<?php endif; ?>
<?php for ($i = 1; $i <= $total_pages; $i++): ?>
<a href="?page=<?php echo $i; ?>"
style="<?php echo $i == $page ? 'font-weight: bold;' : ''; ?>">
<?php echo $i; ?>
</a>
<?php endfor; ?>
<?php if ($page < $total_pages): ?>
<a href="?page=<?php echo $page+1; ?>">Next ยป</a>
<?php endif; ?>
</div>
<p>Menampilkan halaman <?php echo $page; ?> dari <?php echo $total_pages; ?></p>
</body>
</html>
Sebagai final project, kita akan membangun aplikasi manajemen perpustakaan yang mengintegrasikan semua konsep MySQL.
-- SQL Script untuk Database Perpustakaan CREATE DATABASE IF NOT EXISTS perpustakaan CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE perpustakaan; -- Tabel Buku CREATE TABLE buku ( id INT AUTO_INCREMENT PRIMARY KEY, judul VARCHAR(200) NOT NULL, pengarang VARCHAR(100) NOT NULL, penerbit VARCHAR(100), tahun_terbit YEAR, isbn VARCHAR(20) UNIQUE, stok INT DEFAULT 1, rak VARCHAR(10), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- Tabel Anggota CREATE TABLE anggota ( id INT AUTO_INCREMENT PRIMARY KEY, no_anggota VARCHAR(20) NOT NULL UNIQUE, nama VARCHAR(100) NOT NULL, jenis_kelamin ENUM('L', 'P'), alamat TEXT, no_telepon VARCHAR(15), email VARCHAR(100), tanggal_daftar DATE DEFAULT CURRENT_DATE, status ENUM('aktif', 'nonaktif') DEFAULT 'aktif', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Tabel Peminjaman CREATE TABLE peminjaman ( id INT AUTO_INCREMENT PRIMARY KEY, id_buku INT NOT NULL, id_anggota INT NOT NULL, tanggal_pinjam DATE NOT NULL, tanggal_kembali DATE NOT NULL, tanggal_kembali_aktual DATE, status ENUM('dipinjam', 'kembali', 'terlambat') DEFAULT 'dipinjam', denda DECIMAL(10,2) DEFAULT 0, keterangan TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (id_buku) REFERENCES buku(id) ON DELETE RESTRICT, FOREIGN KEY (id_anggota) REFERENCES anggota(id) ON DELETE RESTRICT ); -- Insert data sample INSERT INTO buku (judul, pengarang, penerbit, tahun_terbit, isbn, stok, rak) VALUES ('Pemrograman Web dengan PHP', 'Budi Santoso', 'Informatika', 2023, '978-602-1234-01-1', 5, 'A01'), ('Belajar MySQL', 'Ani Wijaya', 'Andi Offset', 2022, '978-602-1234-02-8', 3, 'A02'), ('Database System', 'John Doe', 'Pearson', 2021, '978-602-1234-03-5', 2, 'B01'), ('Algoritma Pemrograman', 'Citra Dewi', 'Gramedia', 2023, '978-602-1234-04-2', 4, 'B02'), ('Jaringan Komputer', 'Eko Prasetyo', 'Elex Media', 2022, '978-602-1234-05-9', 3, 'C01'); INSERT INTO anggota (no_anggota, nama, jenis_kelamin, alamat, no_telepon, email) VALUES ('AG001', 'Ahmad Fauzi', 'L', 'Jl. Merdeka No.1', '08123456781', 'ahmad@email.com'), ('AG002', 'Budi Santoso', 'L', 'Jl. Sudirman No.5', '08123456782', 'budi@email.com'), ('AG003', 'Citra Dewi', 'P', 'Jl. Gatot Subroto No.10', '08123456783', 'citra@email.com'), ('AG004', 'Dian Purnama', 'P', 'Jl. Diponegoro No.15', '08123456784', 'dian@email.com'), ('AG005', 'Eko Putra', 'L', 'Jl. Ahmad Yani No.20', '08123456785', 'eko@email.com'); INSERT INTO peminjaman (id_buku, id_anggota, tanggal_pinjam, tanggal_kembali, status) VALUES (1, 1, '2026-01-15', '2026-01-22', 'dipinjam'), (2, 2, '2026-01-16', '2026-01-23', 'dipinjam'), (3, 3, '2026-01-10', '2026-01-17', 'kembali'), (1, 4, '2026-01-12', '2026-01-19', 'kembali'), (4, 5, '2026-01-14', '2026-01-21', 'terlambat');
Soal 1: Buat halaman untuk menampilkan daftar buku dengan fitur:
Soal 2: Buat form peminjaman buku dengan fitur:
Soal 3: Buat halaman pengembalian buku dengan fitur:
Soal 4: Buat laporan statistik perpustakaan:
Soal 5: Implementasikan fitur keamanan: